package com.tanjun.publicservice.web.service;

import com.tanjun.common.enums.FileTypeEnum;
import com.tanjun.common.exception.BizException;
import com.tanjun.publicservice.web.exceptions.FileErrCode;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Random;

public interface UploadFileService {
    /**
     * 上传文件
     *
     * @param file         文件内容
     * @param fileTypeEnum 文件类型
     * @return 文件保存路径
     */
    String upload(MultipartFile file, FileTypeEnum fileTypeEnum);

    /**
     * 删除文件
     *
     * @param fileNames 文件名称
     * @return 是否删除成功
     */
    boolean delFiles(List<String> fileNames);

    /**
     * 判断文件是否满足要求
     *
     * @param file         文件
     * @param fileTypeEnum 文件类型
     */
    default void checkFile(MultipartFile file, FileTypeEnum fileTypeEnum) {
        if (file.getSize() > fileTypeEnum.getMaxSize()) {
            throw new BizException(FileErrCode.FILE_SIZE_ERR);
        }
        if (!fileTypeEnum.matchSuffix(file.getOriginalFilename())) {
            throw new BizException(FileErrCode.FILE_SUFFIX_ERR);
        }
        switch (fileTypeEnum) { //判断文件本身是否有问题(防止存在修改文件后缀的情况)
            case IMAGE:
                try (InputStream inputStream = file.getInputStream()) {
                    if (ImageIO.read(inputStream) == null) {
                        throw new BizException(FileErrCode.FILE_ERR);
                    }
                } catch (IOException ex) {
                    throw new BizException(FileErrCode.FILE_ERR);
                }
            case VIDEO:
                break;
        }
    }

    /**
     * 生成新的文件名
     *
     * @param originalFilename
     * @return
     */
    default String generateFileName(String originalFilename) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
        Random random = new Random();
        return LocalDateTime.now().format(formatter) + random.nextInt(1000)
                + originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
    }
}
